// BEGIN LICENSE BLOCK
// Version: CMPL 1.1
//
// The contents of this file are subject to the Cisco-style Mozilla Public
// License Version 1.1 (the "License"); you may not use this file except
// in compliance with the License.  You may obtain a copy of the License
// at www.eclipse-clp.org/license.
// 
// Software distributed under the License is distributed on an "AS IS"
// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See
// the License for the specific language governing rights and limitations
// under the License. 
// 
// The Original Code is  The ECLiPSe Constraint Logic Programming System. 
// The Initial Developer of the Original Code is  Cisco Systems, Inc. 
// Portions created by the Initial Developer are
// Copyright (C) 2006 Cisco Systems, Inc.  All Rights Reserved.
// 
// Contributor(s): 
// 
// END LICENSE BLOCK

package com.parctechnologies.eclipse.visualisation;

import com.parctechnologies.eclipse.*;
import java.util.*;
import java.io.Serializable;

/**
 * Class to represent some basic properties of viewables. This class does not
 * mirror the contents of the ECLiPSe-side data structure.
 */
public class Viewable implements SymRefable, Serializable
{
  private String name;
  private ViewableType type;

  /** 
   * Hold the symbolic refernce for this viewable.  Having SymRefs simplifies
   * scenario recording/playing
   */
  private SymRef symRef ;

  /**
   * Integer used to ensure unique interest spec names.
   */
  private int interestSpecNumber;

  public Viewable(String name, ViewableType type)
  {
    this.name = name;
    this.type = type;
    interestSpecNumber = 0;
    this.symRef = new SymRef(this, getNameString());
  }

  public Atom getNameAtom()
  {
    return(new Atom(name));
  }

  /**
   * Create a uniquely-named interest spec for this viewable.
   */
  public synchronized InterestSpec createInterestSpec()
  {
    if (DebuggingSupport.logMessages) {
      DebuggingSupport.logMessage(this,
				  "createInterestSpec name=" +
				  getNameString() +
				  "number=" + interestSpecNumber);
    }
    InterestSpec result =
      new InterestSpec(getNameString()+interestSpecNumber, this);
    interestSpecNumber++;
    return(result);
  }

  /**
   * Return name in form of a string whether it is one or not.
   */
  public String getNameString()
  {
    return(name);
  }

  public ViewableType getType()
  {
    return(type);
  }

  void setType(ViewableType type)
  {
    this.type = type;
  }

  public SymRef getSymRef() {
    return symRef;
  }

  public void setSymRef(SymRef symRef) {
    this.symRef = symRef;
  }
}
